package com.example.springboot_jdk8.service;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.example.springboot_jdk8.config.CacheCurConfig;
import com.example.springboot_jdk8.entity.MdmOrg;
import com.example.springboot_jdk8.enums.PullDataConfigEnum;

import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 转换数据 - 组织
 */
public abstract class AbsConvertOrgData<T extends MdmOrg> implements IConvertData<T> {

    @Override
    public Boolean supportConvertDataType(PullDataConfigEnum pullDataConfigEnum) {
        return pullDataConfigEnum.equals(PullDataConfigEnum.ORG);
    }

    /**
     * 对外调用的
     * @param subOrgList
     * @return
     */
    @Override
    public List<T> convert(JSONArray subOrgList) {
//        loopDeptPathAndLevel(subOrgList);
        List<T> mdmOrgs = convertOrg0(subOrgList);
        return sortedLevel(mdmOrgs,MdmOrg::getLevel);
    }


    /**
     * 留给子类具体实现转换
     * @param subOrgList
     * @return
     */
    protected abstract List<T> convertOrg0(JSONArray subOrgList);
    /**
     * 按照组织 level 排序
     * 排序完,返回一个新的排序后的集合 (如果用stream必定会返回一个新流,因为
     *  stream 的结束操作 .collect(Collectors.toList()) 会创建一个新集合
     *  ,Collectors.sort 可以不用)
     * @param curBatchData
     * @param function
     * @return
     */
     public List<T> sortedLevel(List<T> curBatchData, Function<T, Integer> function){
        return curBatchData.stream()
                .filter(orgInfo -> function.apply(orgInfo) != null)
                .sorted(Comparator.comparingInt(function::apply))
                .collect(Collectors.toList());
    };



    /*
     * 循环出部门全路径,以及level
     * @param subCompany 公司
     * @param departments 所属公司下的全部组织
     * */
    public void loopDeptPathAndLevel(JSONArray departments) {
        //如果是全量拉取,可在内存中组装路径
        //增量无法返回所有组织,只能用数据库中的数据二次组装
        if (!CacheCurConfig.getConfig().getIsFullPull()) {
            return;
        }
        for (Object department : departments) {
            JSONObject curOrg = (JSONObject) department;
            int level = 1;
            //组织中文名路径
            StringBuilder namePath = new StringBuilder();
            //组织唯一标识路径
            StringBuilder uniquePath = new StringBuilder();
            namePath.append("/").append(curOrg.getStr("orgName"));
            uniquePath.append("/").append(curOrg.getStr("orgUniCode"));
            String parentId = curOrg.getStr("orgParentCode");
            while (!StrUtil.isEmpty(parentId)) {
                String pid = parentId;
                JSONObject parent = (JSONObject) departments.stream().filter(p -> ((JSONObject)p).getStr("orgUniCode").equals(pid)).findFirst().orElse(null);
                if (parent == null) {
                    break;
                }
                namePath.insert(0, "/" + parent.getStr("orgName"));
                uniquePath.insert(0, "/" + parent.getStr("orgUniCode"));
                parentId = parent.getStr("orgParentCode");
                level++;
            }
            curOrg.set("level", level);
            curOrg.set("appOrgNamePath", namePath.toString());
            curOrg.set("appOrgUniquePath", uniquePath.toString());
            level = 1;
        }
    }
}
